package demo1;

import java.util.Arrays;

public class MyArrayList implements Ilist{

    private  int [] array ;
    //记录当前顺序表中使用的空间的个数
    int usedsize = 0;
    //所有空间的个数，spacesize,默认为10
    public static final int DEFAULT_SIZE = 10;
    int spacesize =DEFAULT_SIZE ;

    public MyArrayList() {
        this.array = new int[DEFAULT_SIZE];
    }

    //顺序表中的功能？

    //扩展空间的方法：
    private void  spaceextends(){
        //this.array = new int [spacesize*2];
        //如果直接申请两倍的空间，那么原来顺序表中的数据，会不会消失,会。
        if(spacesize>usedsize){
            return ;
        }else {

            //调用数组本身的方法，使其扩展两倍
            //调用方法？
            this.array = Arrays.copyOf(this.array, this.array.length * 2);
            //创建新的数组，并将原来数组中的值复制到新数组中去
            spacesize = spacesize * 2;
            return ;
        }
    }

    @Override
    //增加一条新的数据
    public void add(int data) {
        //先保证空间足够
        spaceextends();
        array[usedsize++] = data;
    }

    @Override
    public void pos(int pos ,int data) {

        if (pos>usedsize|| pos<0){
                   throw new PosworongfulException("pos位置异常");
        }else {
            spaceextends();
            //下面的语句也符号usedsize==pos时
                for (int i = usedsize;i>=pos ;i--) {
                         array[i]  =     array[i-1];
                }
                array[pos] = data;
                usedsize++;
            }
        }
    @Override
    public boolean contains(int toFind) {
          //判断是否包含指定的数据
        //需要遍历整个顺序表
        for (int i = 0; i < usedsize; i++) {
            if (array[i] == toFind){
                return true ;
            }
        }
        return false;
    }

    @Override
    public int indexof(int toFind) {
        //判断某个元素对应的位置
        //依然需要查找顺序表
        for (int i = 0; i < usedsize; i++) {
            if (array[i] ==toFind){
                //找到了返回i ,没找到返回-1
                return i;
            }
        }
        return -1;
    }

    @Override
    public int get(int pos) {
        //获取pos位置的元素
        //先判断pos 合不合法，是否小于usedsize
        if(pos >=usedsize||pos<0){
            System.out.println("输入的pos不合法");
           throw new PosworongfulException("Pos位置不合法");
        }else {
            return array[pos];
        }
    }

    @Override
    public void setValue(int pos, int value) {
        //将pos位置的值改为value
        //也需要判断pos位置合不合法
        if(pos >=usedsize||pos<0){
            System.out.println("输入的pos不合法");
            throw new PosworongfulException("Pos位置不合法");
        }else {
            array[pos] = value;

        }
    }

    @Override
    public void remove(int toFind) {
        //删除第一次出现的关键字key
        //先判断此元素在数组中的下标
         int ret = this.indexof(toFind);
         if(ret ==-1){
             System.out.println("没有这个数字");
         }
         else {
             //将ret下标之后的数据往左移动一位
             for (int i = ret; i < usedsize-1; i++) {
                 this.array[i] = this.array[i+1];
             }
             this.usedsize--;


         }
    }

    @Override
    public int getsize() {
        //获取顺序表的长度
        return this.usedsize;
    }

    @Override
    public void clear() {
          //清空顺序表
          //对于基本数据类型则将usedsize置为0即可，因为我们是根据usedsize对数组进行操作的
        //usedsize为0，相当于顺序表为空，如果顺序表数据类型为引用数据类型，则需要将每个数组元素
        //置为null
        usedsize = 0;

    }

    @Override
    public void display() {
        //展示顺序表中的元素
        for (int i = 0; i < usedsize; i++) {
            System.out.print(array[i]+" ");
        }

    }
}


